package edu.zut.dvd_demo.dao;


import edu.zut.dvd_demo.entity.DVD;

import java.time.LocalDate;

/**
 * dao：这个包一般默认是数据层的相关操作
 * 数据层：操作数据
 * DVD的数据操作类
 */
public class DvdDaoImpl implements DvdDao{

    //初始化一个对象数组，用于保存所有的DVD对象，注意，这个对象数组需要被共享；同时，默认dvd是从前往后排列，中间没有空元素
    static DVD[] dvds = new DVD[10];

    /**
     * 静态代码块：使用当前类第一次的时候会默认执行
     */
    static {
        dvds[0] = new DVD("杀死比尔", 0, null, 10, 5);
        dvds[1] = new DVD("笑傲江湖", 1, LocalDate.of(2022, 4, 15), 15, 4);
        dvds[2] = new DVD("风声鹤唳", 0, null, 12, 6);
        dvds[3] = new DVD("罗马假日", 0, null, 11, 3);
    }

    /**
     * 查看所有DVD的数据操作
     * 本质就是遍历dvd数组
     */
    @Override
    public void findDvds() {
        for (DVD dvd : dvds) {
            if (null == dvd) {
                break;
            }
            System.out.println(dvd);
        }
    }


    /**
     * 新增DVD的数据操作
     * 遍历dvds数组，当遍历出来的元素为null时，此时当前元素之前的元素都有数据，将新的数据添加在此处即可
     * 新增时，dvds元素已满，我们需要告知用户货架已满，请删除一个再添加
     *
     * @param dvd 具体添加的DVD信息
     * @return 表示添加成功或失败
     */
    @Override
    public boolean addDvd(DVD dvd) {
        for (int i = 0; i < dvds.length; i++) {
            if (dvds[i] == null) {
                dvds[i] = dvd;
                return true;
            }
        }
        return false;
    }


    /**
     * 删除DVD的数据操作
     * 先判断dvd是否存在，如果不存在，就提示用户删除的dvd不存在，如果存在，就删除对应的dvd对象，并将后面的元素往前移动一位
     *
     * @param name 要删除的dvd名字
     * @return 表示删除成功或失败
     */
    @Override
    public boolean deleteDVD(String name) {
        for (int i = 0; i < dvds.length; i++) {
            //根据dvd的名称判断dvd是否存在
            if (dvds[i] != null && dvds[i].getName().equals(name)) {
                //要删除的dvd存在，就直接将后面元素前移
                for (int j = i; j < dvds.length - 1; j++) {
                    dvds[j] = dvds[j + 1];
                }
                //默认最后一个元素置null
                dvds[dvds.length - 1] = null;
                return true;
            }
        }
        return false;
    }


    /**
     * 借出DVD的数据操作
     *
     * @param name dvd名称
     * @return 借出结果    成功   失败（不存在、已被借出）
     */
    @Override
    public String lendDvd(String name) {
        String result = "";
        for (int i = 0; i < dvds.length; i++) {
            //dvd存在
            if (dvds[i] != null && dvds[i].getName().equals(name)) {
                if (dvds[i].getState() == 1) {
                    result = "当前dvd已借出";
                } else {
                    DVD dvd = dvds[i];
                    dvd.setState(1);
                    dvd.setCount(dvd.getCount() + 1);
                    dvd.setDate(LocalDate.now());
                    result = "借出成功";
                }
                break;
            } else {
                //dvd不存在
                result = "dvd不存在";
            }
        }
        return result;
    }


    /**
     * 归还DVD的数据操作
     */
    @Override
    public void revertDvd(String name) {
        //查询是否存在
        DVD dvd = queryByName(name);
        if (null == dvd) {
            System.out.println("没有此DVD");
        } else {
            if (dvd.getState() == 0) {
                System.out.println("当前DVD未被借出");
            } else {
                //dvd存在并已被借出，归还，需要修改状态、计算租金、同时将借出日期置空
                dvd.setState(0);
                int day = LocalDate.now().getDayOfYear() - dvd.getDate().getDayOfYear();
                System.out.println("需要支付的租金：" + (day + 1) * dvd.getRent());
                dvd.setDate(null);
            }
        }
    }

    /**
     * 根据dvd名称查询dvd是否存在
     *
     * @param name dvd名称
     * @return 表示根据dvd名称查询出来的dvd
     */
    @Override
    public DVD queryByName(String name) {
        for (int i = 0; i < dvds.length; i++) {
            if (dvds[i] != null && dvds[i].getName().equals(name)) {
                return dvds[i];
            }
        }
        return null;
    }


}
